package com.itbaizhan;
/*分页查询简介
当一个操作数据库进行查询的语句返回的结果集内容如果过多，
那么内存极有可能溢出，所以在查询中含有大数据的情况下分页是必须的*/
/*物理分页：

在数据库执行查询时（实现分页查询），查询需要的数据—依赖数据库的SQL语句
在SQL查询时，从数据库只检索分页需要的数据
通常不同的数据库有着不同的物理分页语句
MySql物理分页采用limit关键字*/

/*逻辑分页：
在sql查询时，先从数据库检索出所有数据的结果集，在程序内，
通过逻辑语句获得分页需要的数据*/

/*limit的使用： select * from tableName limit  m,n;
*其中m与n为数字。n代表需要获取多少行的数据项，
* 而m代表从哪开始(以0为起始)。
* 例如我们想从users表中先获取前两条数据SQL为：
select * from users limit 0,2;
那么如果要继续看下两条的数据则为：
select * from users limit 2,2;
以此类推
分页公式：(当前页-1)*每页大小*/

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**分页测试类*/
public class PageTest {
    //分页查询users表
    //泛型用Users，因为是查询返回的对象
    //Page的作用：将分页查询的方法的参数通过Page传过来
    //Page的作用:把查询的数据结果集封装起来，再传递给视图
    public Page<Users> selectPage(Page page){
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Users> list = new ArrayList<>();
        try{
            //获取连接对象
            connection = JdbcUtils.getConnection();
            //创建prepareStatement 对象
            ps = connection.prepareStatement("select * from users limit ?,?");
            //绑定m参数,m=(当前页减1)*每页显示的条数
            ps.setInt(1,(page.getCurrentPage()-1)*page.getPageSize());
            //绑定n参数,n为每页显示的条数
            ps.setInt(2,page.getPageSize());
            //执行查询
            rs = ps.executeQuery();
            //处理结果集
            while(rs.next()){
                //完成ORM映射
                Users users = new Users();
                users.setUserid(rs.getInt("userid"));
                users.setUsername(rs.getString("username"));
                users.setUsergae(rs.getInt("userage"));
                list.add(users);
            }
            //将结果集放进Page
            page.setResult(list);
            //查询总条数
            ps = connection.prepareStatement("select count(*) from users");
            //执行查询
            rs = ps.executeQuery();
            while (rs.next()){
                //取结果 可以给列名，也可以给序号，第几列
               int count = rs.getInt(1);//总条数
                //保存总条数
                page.setTotalCount(count);
                //换算总页数 = 总条数/每页显示的条数 向上取整（条数不中一页）
                //Math.ceil()这方法返回的是double类型，所以*1.0
                int totalPage = (int)Math.ceil(1.0*count/page.getPageSize());
                //保存总页数
                page.setTotalPage(totalPage);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(rs,ps,connection);
        }
        return page;
    }

    public static void main(String[] args) {
        PageTest pt = new PageTest();
        //实例化Page,设置参数
        Page page = new Page();
        page.setCurrentPage(1);
        page.setPageSize(2);
        Page page1 = pt.selectPage(page);
        System.out.println("总条数 "+page1.getTotalCount());
        System.out.println("总页数 "+page1.getTotalPage());
        System.out.println("当前页 "+page1.getCurrentPage());
        System.out.println("每页显示的条数 "+page1.getPageSize());
        List<Users> list = page1.getResult();
        for(Users user:list){
            System.out.println(user.getUserid()+" "+user.getUsername()+" "+user.getUsergae());
        }
    }
}
